class Solution {//904 O(N) O(1) 因為只有兩種,還不用雜湊表
public:
int totalFruit(vector<int>& f) {//f代表水果陣列
int a=-1,b=-1,run=0,cur=0,ans=0;//b永遠最新種;a另一種;run尾端連b的長
for (int x: f) {//x每次迭代取到一棵樹的種類值
cur = (x==a || x==b) ? cur+1 : run+1; //合題就延伸; 新b重置為1
run = (x==b) ? run+1 : 1;// b 結尾的連段長度
if (x!=b) { a=b; b=x; }// a要更,b更至最新
ans = (ans>cur)? ans : cur;
}
return ans;
}
};
//同種->cur++、run++;第三種來->cur=run+1、run=1、a=b,b=x
//同步維護ans=max(ans, cur)
//第三種出現,最長合法尾必是「全 b的段落」,再加上x用run+1。
//run:第三種時,合法最長只剩這段->新視窗長=run + 1。
//ans:歷史最大值(答案)。
//第三種來->只留「全b的視窗最右」+ 新的 x。
//「解耦」:不依賴某外部數值或細節。EX:-1哨兵與 n「脫鉤」